CREATE TABLE DimTempo(
idTempo int IDENTITY(1,1) NOT NULL,
Nivel varchar(8) NOT NULL,
Data datetime NULL,
Dia smallint NULL,
DiaSemana varchar(25) NULL,
DiaUtil char(3) NULL,
Feriado char(3) NULL,
FimSemana char(3) NULL,
Quinzena smallint NULL,
Mes smallint NULL,
NomeMes varchar(20) NULL,
FimMes char(3) NULL,
Trimestre smallint NULL,
NomeTrimestre varchar(20) NULL,
Semestre smallint NULL,
NomeSemestre varchar(20) NULL,
Ano smallint NOT NULL,
Estacao varchar(9) NULL,
PRIMARY KEY (idTempo)
)

CREATE TABLE DimFuncionario (
  idFuncionario INTEGER  NOT NULL  IDENTITY,
  cdFuncionario INTEGER  NOT NULL  ,
  Nome VARCHAR(80)  NOT NULL  ,
  CPF VARCHAR(12)  NOT NULL  ,
  Sexo CHAR(1)  NOT NULL  ,
  DataNascimento DATE  NOT NULL  ,
  EstadoCivil VARCHAR(30)  NOT NULL  ,
  Telefone VARCHAR(13)  NOT NULL  ,
  Email VARCHAR(100)  NOT NULL  ,
  Rua VARCHAR(45)  NOT NULL  ,
  Numero VARCHAR(10)  NOT NULL  ,
  Bairro VARCHAR(45)  NOT NULL  ,
  CEP VARCHAR(10)    ,
  Cidade VARCHAR(45)  NOT NULL  ,
  Estado VARCHAR(45)  NOT NULL  ,
  Cargo VARCHAR(45)  NOT NULL  ,
  Salario DECIMAL(11,2)  NOT NULL  ,
  DT_INICIO DATE  NOT NULL  ,
  DT_FIM DATE    ,
  FL_CORRENTE VARCHAR(3)  NOT NULL    ,
PRIMARY KEY(idFuncionario));
GO

CREATE TABLE DimProduto (
  idProduto INTEGER  NOT NULL   IDENTITY ,
  cdProduto INTEGER  NOT NULL  ,
  DescricaoProduto VARCHAR(45)  NOT NULL  ,
  Preco DECIMAL(11,2)  NOT NULL  ,
  Estoque INT  NOT NULL  ,
  DescricaoCategoria VARCHAR(45)  NOT NULL  ,
  Comissao DECIMAL(11,2)  NOT NULL  ,
  Unidade VARCHAR(3)  NOT NULL   ,
  EstoqueMinimo INT   NOT NULL  ,
  CodigoFabricante VARCHAR(20)  NOT NULL  ,
  DT_INICIO DATE  NOT NULL  ,
  DT_FIM DATE    ,
  FL_CORRENTE VARCHAR(3)  NOT NULL    ,
PRIMARY KEY(idProduto));
GO

CREATE TABLE DimCliente (
  idCliente INTEGER  NOT NULL   IDENTITY ,
  cdCliente INTEGER   NOT NULL  ,
  Nome VARCHAR(80)    NOT NULL ,
  CPF VARCHAR(12)    NOT NULL ,
  Sexo CHAR(1)   NOT NULL  ,
  DataNascimento DATE   NOT NULL  ,
  EstadoCivil VARCHAR(30)   NOT NULL  ,
  Telefone VARCHAR(13)   NOT NULL  ,
  Email VARCHAR(100)   NOT NULL  ,
  Rua VARCHAR(45)    NOT NULL ,
  Numero VARCHAR(10)   NOT NULL  ,
  Bairro VARCHAR(45)   NOT NULL  ,
  CEP VARCHAR(10)    ,
  Cidade VARCHAR(45)    NOT NULL ,
  Estado VARCHAR(45)     NOT NULL  ,
PRIMARY KEY(idCliente));
GO

CREATE TABLE DimFormaPagamento (
  idFormaPagamento INTEGER  NOT NULL   IDENTITY ,
  cdFormaPagamento INTEGER  NOT NULL  ,
  Descricao VARCHAR(45)  NOT NULL    ,
PRIMARY KEY(idFormaPagamento));
GO

CREATE TABLE AgregadoFatoVendaCliente (
  idAgregadoFatoVendaCliente INTEGER  NOT NULL   IDENTITY ,
  DimTempo_idTempo INTEGER  NOT NULL  ,
  DimCliente_idCliente INTEGER  NOT NULL  ,
  Quantidade INT  NOT NULL  ,
  cdVenda INT NOT NULL,
  Valor DECIMAL(11,2)  NOT NULL    ,
PRIMARY KEY(idAgregadoFatoVendaCliente)    ,
  FOREIGN KEY(DimCliente_idCliente)
    REFERENCES DimCliente(idCliente),
  FOREIGN KEY(DimTempo_idTempo)
    REFERENCES DimTempo(idTempo));
GO

CREATE INDEX IFK_CliAgr ON AgregadoFatoVendaCliente (DimCliente_idCliente);
GO
CREATE INDEX IFK_AgreTem ON AgregadoFatoVendaCliente (DimTempo_idTempo);
GO

CREATE TABLE FatoVenda (
  idFatoVenda INTEGER  NOT NULL   IDENTITY ,
  DimTempo_idTempo INTEGER  NOT NULL  ,
  DimCliente_idCliente INTEGER  NOT NULL  ,
  DimFormaPagamento_idFormaPagamento INTEGER  NOT NULL  ,
  DimFuncionario_idFuncionario INTEGER  NOT NULL  ,
  DimProduto_idProduto INTEGER  NOT NULL  ,
  cdVenda INTEGER  NOT NULL   ,
  Valor DECIMAL(11,2)   NOT NULL  ,
  Quantidade INT  NOT NULL   ,
  ValorComissao DECIMAL(11,2)  NOT NULL   ,
  DataVenda DATE    NOT NULL   ,
PRIMARY KEY(idFatoVenda)          ,
  FOREIGN KEY(DimProduto_idProduto)
    REFERENCES DimProduto(idProduto),
  FOREIGN KEY(DimFuncionario_idFuncionario)
    REFERENCES DimFuncionario(idFuncionario),
  FOREIGN KEY(DimFormaPagamento_idFormaPagamento)
    REFERENCES DimFormaPagamento(idFormaPagamento),
  FOREIGN KEY(DimCliente_idCliente)
    REFERENCES DimCliente(idCliente),
  FOREIGN KEY(DimTempo_idTempo)
    REFERENCES DimTempo(idTempo));
GO

CREATE INDEX IFK_ProVend ON FatoVenda (DimProduto_idProduto);
GO
CREATE INDEX IFK_FunVen ON FatoVenda (DimFuncionario_idFuncionario);
GO
CREATE INDEX IFK_FomVen ON FatoVenda (DimFormaPagamento_idFormaPagamento);
GO
CREATE INDEX IFK_CliVen ON FatoVenda (DimCliente_idCliente);
GO
CREATE INDEX IFK_TemVen ON FatoVenda (DimTempo_idTempo);
GO



